#include <REGX51.H>
#include <absacc.h>
#include <definicje.h>
#include <prototypy.h>

extern data   	byte pobrane;
extern data   	int  zapisane;
extern data		byte klucz[8];
extern data 	byte klucz2[8];
extern data    	byte bufor[16];
extern data		byte rozmiar[4];
extern xdata	byte zaszyfrowane[2048];
extern bdata 	bit	 klucz_wczytany;
extern bdata   	bit  koniec_transmisji;



void szyfruj(void)
{

	byte i;
	koniec_transmisji=0;
	
	if(!klucz_wczytany)
	{
		lcd_NowaLinia();
		lcd_WyczyscLinie();
		lcd_PiszTekst("  Brak klucza!  ");
		beep();
		czekaj(2);
		goto koniec_szyfrowania;
	}
	
	//wlaczam przerwania z timera 0 i COM
	led_Off();
	przerwania_Off();
	timer_UstawDoCom();
	com_PrzygotujOdbieranie();

	lcd_Wyczysc();
	lcd_PiszTekst("Podlacz terminali nacisnij ENTER");
	czekaj_na_klawisz(0x0F);
	lcd_Wyczysc();
	lcd_PiszTekst("*Szyfrowanie...* ENTER - koniec ");
	w7segm_Init();
	rozmiar_Reset();
	timer_1_Start();
	pobrane=0;
	zapisane=0;
	/*
	KONCEPCJA: tutaj zabawiam sie wyswietlaczem 7segm, a przerwanie COM1
	zajmuje sie reszta.
	Nie da rady.
	*/
	
	while(!koniec_transmisji)
	{
		//najpierw wyswietlamy stan licznika na 7segm
		i=0;
		while(i!=4)
		{				
			w7segm_Off();
			w7segm_WybierzWskaznik(i);
			w7segm_WybierzSegmenty(rozmiar[3-i]);
			w7segm_On();

			//czekam dokladnie 1ms
			#pragma asm
				clr a
				djnz acc,$
				mov a,#243
				djnz acc,$
			#pragma endasm
			i++;
		}
		//to dziala, nie grzeb tu kretynie, bo znowu zepsujesz.
		
		
		//jezeli czeka cos w buforze
		if(RI)
		{
			RI=0;
			//tutaj dzieie sie magia programu (szyfrowanie)
			bufor[pobrane]=SBUF;	
			pobrane++;
			zapisane++;
			koniec_transmisji=rozmiar_Dec(); //jesli licznik 7segm zejdzie do zera, koniec zabawy
			if(pobrane==16)
			{
				pobrane=0;
				zaszyfruj_bufor();
			}
		}

		else if(XBYTE[0xF022]>>7==0)//jesli wcisniemy enter
		{
			w7segm_Off();
			while(XBYTE[0xF022]!=0xFF);
			if(pobrane!=0)
			{
				while(pobrane!=16)
				{
					bufor[pobrane]=' ';
					pobrane++;
					zapisane++;
				}
				zaszyfruj_bufor();
			}
			koniec_transmisji=1;	
		}

	}



	
	lcd_Wyczysc();
	lcd_PiszTekst("     KONIEC     Wcisnij ENTER...");
	beep();
	czekaj_na_klawisz(0x0F);
	koniec_szyfrowania:
	;
}




bit rozmiar_Dec(void)
{
	byte i=4;
	bit  c=1;
	while(i!=0)
	{
		i--;
		if(rozmiar[i]==0)
		{
			rozmiar[i]=9;
		}
		else
		{
			rozmiar[i]--;
			break;
		}
	}
	return(i==0&&rozmiar[0]==0);
}





/*klucz[8], klucz2[8], bufor[16], zaszyfrowane[20480], int zapisane(0-20480)

algorytmy :
byte ZamienParyZwrocOperacje(byte);
void alg_Bsl(void);
void alg_Bsr(void);
void alg_Xor(void);
void alg_Xnor(void);
*/

void zaszyfruj_bufor(void)
{
	byte i=0, operacja;
	while(i!=32) //i jest numerem pary bitow w kluczu
	{
		operacja=ZamienParyZwrocOperacje(i);
		switch(operacja)
		{
			case 0:
				alg_Bsl();
			break;
				
			case 1:
				alg_Bsr();
			break;
				
			case 2:
				alg_Xor();
			break;

			case 3:
				alg_Xnor();
			break;
		}
		ZamienParyZwrocOperacje(i);
		i++;
	}
	i=0;
	zapisane -= 16;
	while(i!=16)
	{
		zaszyfrowane[zapisane]=bufor[i];
		i++;
		zapisane++;
	}
			
}
















